package com.itheima.controller;

import com.itheima.anno.Log;
import com.itheima.pojo.Dept;
import com.itheima.pojo.Result;
import com.itheima.service.DeptService;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.io.IOException;
import java.util.List;

// 控制器命名规范: XxxController   Xxx就是要操作的数据
@RestController // 处理请求和响应
@RequestMapping("/depts")
@Slf4j
public class DeptController {

    @Autowired
    private DeptService deptService;

    @GetMapping // 只支持GET请求
    public Result list() throws IOException {
        log.info("list deptService: {}", deptService);
        log.info("list deptService getClass: {}", deptService.getClass());
        // 调用业务层获取处理好的数据
        List<Dept> deptList = deptService.list();

        // 5.返回List集合
        return Result.success(deptList);
    }

    /**
     * 根据id删除部门
     * 浏览器发送: /depts?id=1       id=1请求参数        delete(Integer deptId): 方法的形式参数
     * @RequestParam: 请求参数映射, 当请求参数名和方法的形参名不同,指定对应关系
     * @RequestParam的required默认值为true, 必须要有这个请求参数,否则就报错
     * @param id
     * @return
     */
    // @DeleteMapping("/depts")
    // public Result delete(@RequestParam("id") Integer deptId) {
    //     System.out.println("deptId = " + deptId);
    //
    //     return Result.success();
    // }

    /**
     * 根据id删除部门
     * @param id
     * @return
     */
    @Log
    @DeleteMapping
    public Result delete(Integer id) {
        // 获取请求参数
        log.info("id = " + id);

        // 调用业务层处理删除部门
        int row = deptService.delete(id);
        System.out.println("row = " + row);

        // 响应数据
        return Result.success();
    }

    /**
     * 添加部门
     * 请求参数是JSON类型, 转成对象处理
     * @RequestBody: 1.获取请求体的数据, 2.把请求体的JSON数据自动转成参数的类型Dept
     * @param dept
     * @return
     */
    @Log
    @PostMapping
    public Result add(@RequestBody Dept dept) {
        // 获取请求参数
        log.info("dept = " + dept);

        // 调用业务层添加部门
        int row = deptService.add(dept);

        // 响应结果
        return Result.success();
    }

    /**
     * 修改部门-根据id查询部门
     * 浏览器发送: /depts/1  数据直接写在路上,并且没有名字, 路径参数, {名字}获取路径上的参数
     * @PathVariable: 把路径上的参数赋值给方法的形参
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    public Result getById(@PathVariable Integer id) {
        // 获取请求参数
        log.info("id = " + id);

        // 调用业务层根据id查询部门
        Dept dept = deptService.getById(id);

        // 响应结果, 不要忘记传递dept对象
        return Result.success(dept);
    }

    /**
     * 根据id修改部门
     * @param dept
     * @return
     */
    @Log
    @PutMapping
    public Result update(@RequestBody Dept dept) {
        // 获取请求参数
        log.info("dept = " + dept);

        // 调用业务层修改部门
        int row = deptService.update(dept);
        System.out.println("row = " + row);

        // 响应数据
        return Result.success();
    }
}
